package cn.springboottest;

import cn.springboottest.domain.Stu;
import cn.springboottest.util.LoadStu;
import redis.clients.jedis.Jedis;
import cn.springboottest.util.RedisMap;

import java.util.ArrayList;
import java.util.List;

public class JedisTest {
    //保存学生学号的前缀
    public static final String STU_ID = "stu::id";
    //保存学生信息的前缀
    public static final String STU_INFO_PREFIX="stu::info::";
    public static final String STU_USERNAME = "stu::username";
    public static final String STU_SCORE_JAVA = "stu::score::java";
    public static final String STU_SCORE_MATH = "stu::score::math";
    Jedis jedis=new Jedis();
    public List<Stu> initStu(){//初始化一组数据
        List<Stu> stu1 = new ArrayList<>();
        for(int i=0;i<10;i++){
            Stu stu = new Stu();
            stu.setUsername("redis"+i);//对应String类型
            stu.setJava(78+Math.random()*15);
            stu.setMath(88+Math.random()*10);
            stu1.add(stu);//初始化10条数据到链表stu1中，每条信息都是一个Stu实例对象
        }
        return stu1;
    }

    public List<Stu> loadStu(){//初始化一组数据
        LoadStu load=new LoadStu();
        List<Stu> stu1 =load.printStu();
        return stu1;
    }


    //建立学号和姓名,java成绩，math成绩之间的关系
    public void add(Stu stu){//添加信息到redis中
        stu.setId(jedis.incr(STU_ID));//list类型一键对多值，incr只能增加long类型数据------k1
        //保存学生信息，将学生的信息利用hash表存入到redis中
        String key=STU_INFO_PREFIX+stu.getId();//即stu::info::id
        var map= RedisMap.toMap(stu);//将学生信息反射到Map对象上
        jedis.hmset(key, map);//加hash对象转化为Map------k2
        //String tostring=""+stu.getId();
        //判断对应的名字在hash表中是否存在
        String username = stu.getUsername();//当前名字，用以对比判断是否已经存在
        if(!jedis.hexists(STU_USERNAME,username)){
            //对应的名字不存在，第一个叫此名字的如下------建立学号和姓名之间的对应关系stu::name----------------1
            jedis.hset(STU_USERNAME,stu.getUsername(),""+stu.getId());//------k3
        }else {
            String oldid=jedis.hget(STU_USERNAME,username);//当前学号
            String newId=oldid+","+stu.getId();//新的学号
            jedis.hset(STU_USERNAME,username,newId);//向hash表中
        }

        //建立学号和java成绩之间的关系------------------------------stu::score::java-------------------2
        jedis.zadd(STU_SCORE_JAVA,stu.getJava(),""+stu.getId());//----k4
        //建立学号和os成绩之间的关系--------------------------------stu::score::os---------------------3
        jedis.zadd("stu::score::os",stu.getOs(),""+stu.getId());
        //建立学号和math成绩之间的关系------------------------------stu::score::math-------------------4
        jedis.zadd(STU_SCORE_MATH,stu.getMath(),""+stu.getId());//----k5


    }

    public static void main(String[] args) {
        JedisTest jdt=new JedisTest();
        List<Stu> stus=jdt.initStu();
        stus.forEach(jdt::add);

    }


}

